//
//  typsig.h
//  LTLBMC
//
//  Created by GD Huang on 5/18/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef LTLBMC_typsig_h
#define LTLBMC_typsig_h

#include "attribute.h"
#include "astVisitor.h"

namespace cilast {
    
    
    class typ;
    
    class typsig : public OCamlObject {
        virtual int accept(astVisitor*);

    };
    
    class TSArray : public typsig {
    public:    
        typsig* mtypsig;
        long long mint;
        std::vector<attribute*> mattributes;
        
        int accept(astVisitor*);
    };
    
    
    class TSPtr : public typsig {
    public:    
        typsig* mtypsig;
        std::vector<attribute*> mattributes;
        
        int accept(astVisitor*);
    };
    
    
    class TSComp : public typsig {
    public:    
        bool mbool;
        char* mstr;
        std::vector<attribute*> mattributes;
        
        int accept(astVisitor*);
    };
    
    
    class TSFun : public typsig {
    public:    
        typsig* mtypsig;
        std::vector<typsig*> mtypsigs;
        bool mbool;
        std::vector<attribute*> mattributes;

        int accept(astVisitor*);
    };
    
    
    class TSEnum : public typsig {
    public:    
        char* mstr;
        std::vector<attribute*> mattributes;
        
        int accept(astVisitor*);
    };
    
    class TSBase : public typsig {
    public:    
        typ* mtyp;
        
        int accept(astVisitor*);
    };
    
}

#endif
